
#include "Pelota.h"


/**
Constructor en el cual se le pasan por parametro los atributos de una pelota,
y la info para moverse que son:
- double anguloTrayectoria; angulo medido con la horizontal que determina la direccion de la trayectoria;
- bool estaEnCarril: false si esta saliendo del sapo, y true cuando la pelota esta en el carril.
-- incremento: valor que va a indicar el movimiento de la pelota en cada iteracion, seteado en 2;
**/

Pelota::Pelota(Textura* fondo, double rad,double posx,double posy, string idn,double anguloTrayectoria,bool estaEnCarril)
{
	this->posx = posx;
	this->posy = posy;
	this->fondo = fondo;
	this->radio = rad;
	this->id = idn;
	this->setAnguloTrayectoria(anguloTrayectoria); 
	this->estaEnCarril = estaEnCarril;
	this->setIncremento(1);
}
Pelota* Pelota::Clonar(){
        Pelota* pelota=new Pelota(this->getFondo()->Clone(),this->getRadio(),this->getPosX(),this->getPosY(),"d",this->getAnguloTrayectoria(),false);
        return pelota;
}

// Devuelve el screen con la imagen cargada
void Pelota::Dibujar(SDL_Surface *screen)
{

	SDL_Surface *image = this->getFondo()->getImagen();
	//Seteo el negro como color de fondo transparente para que dibuje solo el sapo
	SDL_SetColorKey(image, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(image->format,0,0,0));
	
	SDL_Rect rect;
	rect.x = this->posXRelAPantalla(screen->h,screen->w) - (image->w/2); 
	rect.y = this->posYRelAPantalla(screen->h,screen->w) - (image->h/2);
	
	SDL_BlitSurface(image, 0, screen, &rect);
}

void Pelota::CargarTextura()
{
	this->fondo->cargar(this->getRadio());
}


Pelota::~Pelota(void)
{
}

double Pelota::getNorte(void){

	return this->posy + this->radio;
}

double Pelota::getSur(void){

	return this->posy - this->radio;
}

double Pelota::getEste(void){
	
	return this->posx + this->radio ;
}

double Pelota::getOeste(void){

	return this->posx - this->radio ;
}

double Pelota::getAnguloTrayectoria(void){
	
	return this->anguloTrayectoria;
}

//devuelve el angulo siempre positivo
double Pelota::getAnguloTrayectoriaFixed(void){

	double aux = this->anguloTrayectoria;

	if( aux > 360) aux -= 360;

	if (aux < 0) return 360 + aux;
	else return aux;

}

void Pelota::setAnguloTrayectoria(double angulo){
	this->anguloTrayectoria=angulo;
}

double Pelota::getIncremento(void){
	return this->incremento;
}

void Pelota::setIncremento(double inc){
	this->incremento=inc;
}

// Seteo si la pelota esta en carril
void Pelota::setEstaEnCarril(bool encarril){

	this->estaEnCarril = encarril;
}

// devuelve el siguiente punto de movimiento para chequear antes de mover la pelota si colisiona.
Punto Pelota::getSiguientePosicion(void){
	double incrementoX=0;
	double incrementoY=0;

	double anguloRadianes=(getAnguloTrayectoria()*M_PI)/180;

	incrementoX=cos(anguloRadianes)*getIncremento();
	incrementoY=sin(anguloRadianes)*getIncremento();
	
	//this->setP this->getPosX()+nuevoX;
	

	Punto punto;
	punto.setPosX(this->getPosX()+incrementoX);
	punto.setPosY(this->getPosY()+incrementoY);

	return punto;
}


bool Pelota::esParteDelCarril(void){
	return this->estaEnCarril;
}
